/**
 * Copyright(c) 2013 Jade Techonologies Co., Ltd.
 *
 * History:
 *   13-4-14 下午6:15 Created by dwzhang
 */
package com.jade.framework.base.criterion;

import java.util.Collection;

import com.jade.framework.base.criterion.expression.*;

/**
 * Restrictions用于创建常用的表达式.
 *
 * @author dwzhang
 * @version 1.0 13-4-14 下午6:15
 */
public final class Restrictions
{
    /** This class can't be instaniated. */
    private Restrictions()
    {
    }

    /**
     * 创建等于表达式.
     *
     * @param propName  属性名
     * @param propValue 属性值
     * @return equal expression
     */
    public static <T> CompareExpression eq(String propName, T propValue)
    {
        return new CompareExpression(propName, propValue, Constants.EQUALITY_SIGN);
    }

    /**
     * 创建等于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return equal expression
     */
    public static <T> CompareExpression eq(String entityName, String propName, T propValue)
    {
        return new CompareExpression(entityName, propName, propValue, Constants.EQUALITY_SIGN);
    }

    /**
     * 创建基于属性的等于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return equal expression
     */
    public static <T> ConjunctionExpression eqConjunction(String entityName, String propName, T propValue)
    {
        return new ConjunctionExpression(entityName, propName, propValue, Constants.EQUALITY_SIGN);
    }

    /**
     * 创建不等于表达式.
     *
     * @param propName  属性名
     * @param propValue 属性值
     * @return not equal expression
     */
    public static <T> CompareExpression ne(String propName, T propValue)
    {
        return new CompareExpression(propName, propValue, Constants.INEQUALITY_SIGN);
    }

    /**
     * 创建不等于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return not equal expression
     */
    public static <T> CompareExpression ne(String entityName, String propName, T propValue)
    {
        return new CompareExpression(entityName, propName, propValue, Constants.INEQUALITY_SIGN);
    }

    /**
     * 创建基于属性的不等于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return not equal expression
     */
    @Deprecated
    public static <T> ConjunctionExpression neqConjunction(String entityName, String propName, T propValue)
    {
        return new ConjunctionExpression(entityName, propName, propValue, Constants.INEQUALITY_SIGN);
    }

    /**
     * 创建基于属性的不等于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return not equal expression
     */
    public static <T> ConjunctionExpression neProperty(String entityName, String propName, T propValue)
    {
        return new ConjunctionExpression(entityName, propName, propValue, Constants.INEQUALITY_SIGN);
    }

    /**
     * 创建小于等于表达式.
     *
     * @param propName  属性名称。
     * @param propValue 属性值。
     * @return less or equal epxression
     */
    public static <T> CompareExpression le(String propName, T propValue)
    {
        return new CompareExpression(propName, propValue, Constants.LESS_EQUALITY_SIGN);
    }

    /**
     * 创建小于等于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名称。
     * @param propValue  属性值。
     * @return less or equal epxression
     */
    public static <T> CompareExpression le(String entityName, String propName, T propValue)
    {
        return new CompareExpression(entityName, propName, propValue, Constants.LESS_EQUALITY_SIGN);
    }

    /**
     * 创建基于属性的小于等于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名称。
     * @param propValue  属性值。
     * @return less or equal epxression
     */
    public static <T> ConjunctionExpression leConjunction(String entityName, String propName, T propValue)
    {
        return new ConjunctionExpression(entityName, propName, propValue, Constants.LESS_EQUALITY_SIGN);
    }

    /**
     * 创建小于表达式.
     *
     * @param propName  属性名
     * @param propValue 属性值
     * @return less epxression
     */
    public static <T> CompareExpression lt(String propName, T propValue)
    {
        return new CompareExpression(propName, propValue, Constants.LESS_SIGN);
    }

    /**
     * 创建小于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return less epxression
     */
    public static <T> CompareExpression lt(String entityName, String propName, T propValue)
    {
        return new CompareExpression(entityName, propName, propValue, Constants.LESS_SIGN);
    }

    /**
     * 创建基于属性的小于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return less epxression
     */
    public static <T> ConjunctionExpression ltConjunction(String entityName, String propName, T propValue)
    {
        return new ConjunctionExpression(entityName, propName, propValue, Constants.LESS_SIGN);
    }

    /**
     * 创建大于等于表达式.
     *
     * @param propName  属性名
     * @param propValue 属性值
     * @return large or equal epxression
     */
    public static <T> CompareExpression ge(String propName, T propValue)
    {
        return new CompareExpression(propName, propValue, Constants.GREAT_EQUALITY_SIGN);
    }

    /**
     * 创建大于等于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return large or equal epxression
     */
    public static <T> CompareExpression ge(String entityName, String propName, T propValue)
    {
        return new CompareExpression(entityName, propName, propValue, Constants.GREAT_EQUALITY_SIGN);
    }

    /**
     * 创建基于属性的大于等于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return large or equal epxression
     */
    public static <T> ConjunctionExpression geConjunction(String entityName, String propName, T propValue)
    {
        return new ConjunctionExpression(entityName, propName, propValue, Constants.GREAT_EQUALITY_SIGN);
    }

    /**
     * 创建大于表达式.
     *
     * @param propName  属性名
     * @param propValue 属性值
     * @return large epxression
     */
    public static <T> CompareExpression gt(String propName, T propValue)
    {
        return new CompareExpression(propName, propValue, Constants.GREAT_SIGN);
    }

    /**
     * 创建大于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return large epxression
     */
    public static <T> CompareExpression gt(String entityName, String propName, T propValue)
    {
        return new CompareExpression(entityName, propName, propValue, Constants.GREAT_SIGN);
    }

    /**
     * 创建基于属性的大于表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @return large epxression
     */
    public static <T> ConjunctionExpression gtConjunction(String entityName, String propName, T propValue)
    {
        return new ConjunctionExpression(entityName, propName, propValue, Constants.GREAT_SIGN);
    }

    /**
     * 创建and表达式.
     *
     * @param criterions and表达式中的的条件集合
     * @return and expression
     */
    public static AndExpression and(Criterion... criterions)
    {
        return new AndExpression(criterions);
    }

    /**
     * 创建or表达式.
     *
     * @param criterions or表达式中的的条件集合
     * @return or expression
     */
    public static Criterion or(Criterion... criterions)
    {
        return new OrExpression(criterions);
    }

    /**
     * 创建null表达式.
     *
     * @param propName 属性名
     * @return or expression
     */
    public static Criterion isNull(String propName)
    {
        return new NullExpression(propName);
    }

    /**
     * 创建null表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @return or expression
     */
    public static Criterion isNull(String entityName, String propName)
    {
        return new NullExpression(entityName, propName);
    }

    /**
     * 创建notNull表达式.
     *
     * @param propName 属性名
     * @return or expression
     */
    public static Criterion isNotNull(String propName)
    {
        return new NotNullExpression(propName);
    }

    /**
     * 创建notNull表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @return or expression
     */
    public static Criterion isNotNull(String entityName, String propName)
    {
        return new NotNullExpression(entityName, propName);
    }

    /**
     * 创建In表达式.
     *
     * @param propName   属性名
     * @param propValues 属性值
     * @return in expression
     */
    public static <T> Criterion in(String propName, T[] propValues)
    {
        return new InExpression(propName, propValues);
    }

    /**
     * 创建In表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValues 属性值
     * @return in expression
     */
    public static <T> Criterion in(String entityName, String propName, T[] propValues)
    {
        return new InExpression(entityName, propName, propValues);
    }

    /**
     * 创建In表达式.
     *
     * @param propName   属性名
     * @param propValues 属性值
     * @return in expression
     */
    public static <T> Criterion in(String propName, Collection<T> propValues)
    {
        return new InExpression(propName, propValues.toArray());
    }

    /**
     * 创建In表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValues 属性值
     * @return in expression
     */
    public static <T> Criterion in(String entityName, String propName, Collection<T> propValues)
    {
        return new InExpression(entityName, propName, propValues.toArray());
    }

    /**
     * 创建not in表达式.
     *
     * @param propName   属性名
     * @param propValues 属性值
     * @return in expression
     */
    public static <T> Criterion notIn(String propName, T[] propValues)
    {
        return new NotInExpression(propName, propValues);
    }

    /**
     * 创建Not In表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValues 属性值
     * @return in expression
     */
    public static <T> Criterion notIn(String entityName, String propName, T[] propValues)
    {
        return new NotInExpression(entityName, propName, propValues);
    }

    /**
     * 创建Not In表达式.
     *
     * @param propName   属性名
     * @param propValues 属性值
     * @return in expression
     */
    public static <T> Criterion notIn(String propName, Collection<T> propValues)
    {
        return new NotInExpression(propName, propValues.toArray());
    }

    /**
     * 创建In表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValues 属性值
     * @return in expression
     */
    public static <T> Criterion notIn(String entityName, String propName, Collection<T> propValues)
    {
        return new NotInExpression(entityName, propName, propValues.toArray());
    }

    /**
     * 创建between表达式.
     *
     * @param propName 属性名
     * @param low      起始属性值
     * @param high     终止属性值
     * @return between expression
     */
    public static <T> Criterion between(String propName, T low, T high)
    {
        return new BetweenExpression(propName, low, high);
    }

    /**
     * 创建between表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param low        起始属性值
     * @param high       终止属性值
     * @return between expression
     */
    public static <T> Criterion between(String entityName, String propName, T low, T high)
    {
        return new BetweenExpression(entityName, propName, low, high);
    }

    /**
     * 创建like表达式.
     *
     * @param propName  属性名
     * @param propValue 属性值
     * @return like expression
     */
    public static <T> LikeExpression like(String propName, T propValue)
    {
        return new LikeExpression(propName, propValue);
    }

    /**
     * 创建like表达式.
     *
     * @param propName  属性名
     * @param propValue 属性值
     * @param matchMode 匹配模式
     * @return like expression
     */
    public static <T> LikeExpression like(String propName, T propValue, MatchMode matchMode)
    {
        return new LikeExpression(propName, propValue, matchMode);
    }

    /**
     * 创建like表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @param propValue  属性值
     * @param matchMode  匹配模式
     * @return like expression
     */
    public static <T> LikeExpression like(String entityName, String propName, T propValue, MatchMode matchMode)
    {
        return new LikeExpression(entityName, propName, propValue, matchMode);
    }

    /**
     * 创建一个基本的Match表达式。
     *
     * @param query  检索文本
     * @param fileds 检索字段
     * @return Match表达式
     */
    public static <T> MatchExpression match(String query, String... fileds)
    {
        return new MatchExpression(query, fileds);
    }

    /**
     * 创建一个基本的QueryString表达式。
     *
     * @param query  检索文本
     * @param fileds 检索字段
     * @return QueryString表达式
     */
    public static <T> QueryStringExpression queryString(String query, String... fileds)
    {
        return new QueryStringExpression(query, fileds);
    }

    /**
     * 创建Not表达式.
     *
     * @param criterion not中的表达式
     * @return not expression
     */
    public static NotExpression not(Criterion criterion)
    {
        return new NotExpression(criterion);
    }

    /**
     * 创建Group表达式.
     *
     * @param entityName 实体名称.
     * @param propName   属性名
     * @return group by expression
     */
    public static Group group(String entityName, String propName)
    {
        return new Group(entityName, propName);
    }

    /**
     * 创建Having表达式.
     *
     * @param criterion 条件
     * @return Having Expression
     */
    public static Having having(Criterion criterion)
    {
        return new Having(criterion);
    }
}